﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using BAL;
using DAL.Entities;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace GrouponDesktop.AbmProveedor
{
    public partial class AgregarOEditarProveedor : Form
    {
        private int IdProveedor { set; get; }
        private ProveedorEntity proveedorInfo { set; get; }

        public AgregarOEditarProveedor(int intIdProveedor)
        {
            IdProveedor = intIdProveedor;

            //Cambiamos el titulo
            if (IdProveedor == 0)
            {
                this.Name = "Agregar Proveedor";
            }
            else
            {
                this.Name = "Editar Proveedor";
            }
            InitializeComponent();

            //Traemos los rubros para elegir
            List<RubroEntity> rubros = new List<RubroEntity>();
            RubroBAL rubProxy = new RubroBAL();
            rubros = rubProxy.GetRubros();

            cboRubro.DisplayMember = "VarNombre";
            cboRubro.ValueMember = "IntIdRubro";
            cboRubro.DataSource = rubros;

            //Traemos las ciudades para elegir
            List<CiudadEntity> ciudades = new List<CiudadEntity>();
            CiudadBAL ciuProxy = new CiudadBAL();
            ciudades = ciuProxy.GetCiudades();

            cboCiudad.DisplayMember = "VarNombre";
            cboCiudad.ValueMember = "IntIdCiudad";
            cboCiudad.DataSource = ciudades;

            proveedorInfo = new ProveedorEntity();
            
            //Si es un editar buscamos los datos
            if (IdProveedor != 0)
            {
                
                if (proveedorInfo.BitIsDeleted)
                {
                    cboBitIsDeleted.SelectedIndex = 0;
                }
                else
                {
                    cboBitIsDeleted.SelectedIndex = 1;
                }

                proveedorInfo.IntIdProveedor = IdProveedor;

                ProveedorBAL provProxy = new ProveedorBAL();
                proveedorInfo = provProxy.GetProveedorById(proveedorInfo);


                //Obtenemos las ciudades
                CiudadBAL proxy = new CiudadBAL();

                txtCPostal.Text = proveedorInfo.IntCodigoPostal.ToString();
                txtCUIT.Text = proveedorInfo.VarCUIT;
                txtDireccion.Text = proveedorInfo.VarDom;
                txtEmail.Text = proveedorInfo.VarMail;
                txtNombreContacto.Text = proveedorInfo.VarNombreContacto;
                txtRS.Text = proveedorInfo.VarRS;
                txtTelefono.Text = proveedorInfo.IntTelefono.ToString();
                cboCiudad.SelectedValue = proveedorInfo.IntIdCiudad;
                cboRubro.SelectedValue = proveedorInfo.IntIdRubro;

            }
            else
            {
                cboBitIsDeleted.Visible = false;
                lblBitIsDeleted.Visible = false;
            }

            this.SuspendLayout();

        }
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            
             lblErrores.Text = string.Empty;
            if (ValidateForm())
            {
                ProveedorBAL proxy = new ProveedorBAL();

                //TODO: VERIFICAR LOS DATOS DE TELEFONO CODIGO PSOTAL Y DNI
                ProveedorEntity prov = new ProveedorEntity();
                prov.VarCUIT = txtCUIT.Text;
                prov.VarDom = txtDireccion.Text;
                prov.IntCodigoPostal = (txtCPostal.Text != string.Empty) ? Int32.Parse(txtCPostal.Text) : 0;
                prov.VarMail = txtEmail.Text;
                prov.VarNombreContacto = txtNombreContacto.Text;
                //client.BigDNI = long.Parse(txtDNI.Text);
                prov.VarRS = txtRS.Text;
                prov.IntTelefono = long.Parse(txtTelefono.Text);

                prov.IntIdCiudad =  int.Parse(cboCiudad.SelectedValue.ToString());
                prov.IntIdRubro = int.Parse(cboRubro.SelectedValue.ToString());
               
                if (IdProveedor == 0)
                {
                    proxy.AddProveedor(prov);

                }
                else
                {
                    if (cboBitIsDeleted.SelectedItem == "Si")
                    {
                        prov.BitIsDeleted = true;
                    }
                    else
                    {
                        prov.BitIsDeleted = false;
                    }
                    prov.IntIdProveedor = IdProveedor;
                    proxy.UpdateProveedor(prov);
                }
                this.Close();
            }
        }


        /// <summary>
        /// Funcion que valida si un mail esta bien escrito
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        private Boolean email_bien_escrito(String email)
        {
            String expresion;
            expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (Regex.IsMatch(email, expresion))
            {
                if (Regex.Replace(email, expresion, String.Empty).Length == 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Funcion que valida el fomrmulario
        /// </summary>
        /// <returns></returns>
        public bool ValidateForm()
        {
            bool res = true;
            string errores = string.Empty;
            
            
            ProveedorBAL prox = new ProveedorBAL();

            //Validamos el cuit
            if (txtCUIT.Text != string.Empty)
            {
                if (proveedorInfo.VarCUIT != txtCUIT.Text)
                {
                    ProveedorEntity _prov = new ProveedorEntity();
                    _prov.VarCUIT = txtCUIT.Text;
                    _prov = prox.GetProveedorByCuit(_prov);
                    if (_prov.IntIdProveedor != null && _prov.IntIdProveedor != 0)
                    {
                        errores += "El CUIT ya esta registrado\n";
                        res = false;
                    }
                    _prov.IntIdProveedor = 0;
                }
            }
            else
            {
                errores += "El CUIT es obligatorio\n";
                res = false;
            }

            //Validamos la razon social
             if (txtRS.Text != string.Empty)
            {
                if (proveedorInfo.VarRS != txtRS.Text)
                {
                    ProveedorEntity _prov = new ProveedorEntity();
                    _prov.VarRS = txtRS.Text;
                    _prov = prox.GetProveedorByRazonSocial(_prov);
                    if (_prov != null && _prov.IntIdProveedor != 0)
                    {
                        errores += "La Ran Social ya esta registrado\n";
                        res = false;
                    }
                    _prov.IntIdProveedor = 0;
                }
            }
            else
            {
                errores += "La Razon Social es obligatorio\n";
                res = false;
            }
            
            if (txtDireccion.Text == string.Empty)
            {
                errores += "La direccion es obligatorio\n";
                res = false;
            }
            if (txtCPostal.Text == string.Empty)
            {
                errores += "El Codigo Postal es obligatorio\n";
                res = false;
            }
            else
            {
                try
                {
                    int algo = Int32.Parse(txtCPostal.Text);
                }
                catch (FormatException ex)
                {
                    errores += "El Codigo Postal no tiene un formato valido\n";
                    res = false;
                }
                catch (OverflowException ex)
                {
                    errores += "El Codigo Postal no tiene un formato valido\n";
                    res = false;
                }

            }
            if (txtNombreContacto.Text == string.Empty)
            {
                errores += "El nombre de contacto es obligatorio\n";
                res = false;
            }
            if (txtEmail.Text == string.Empty)
            {
                errores += "El email es obligatorio\n";
                res = false;
            }
            else
            {
                //Validamos el mail
                if (!email_bien_escrito(txtEmail.Text))
                {
                    errores += "El email no es valido\n";
                    res = false;
                }
            }
            if (txtTelefono.Text == string.Empty)
            {
                errores += "El telefono es obligatorio\n";
                res = false;
            }
            else
            {
                try
                {
                    long algo = long.Parse(txtTelefono.Text);
                }
                catch (FormatException ex)
                {
                    errores += "El Telefono no tiene un formato valido\n";
                    res = false;
                }
                catch (OverflowException ex)
                {
                    errores += "El Telefono no tiene un formato valido\n";
                    res = false;
                }
            }
            if(IdProveedor != 0){
                if (cboBitIsDeleted.SelectedItem == null || cboBitIsDeleted.SelectedItem.ToString() == string.Empty)
                {
                    errores += "Debe elegir un valor para el campo deshabilitado\n";
                    res = false;
                }
            }
            if (errores != string.Empty)
            {
                MessageBox.Show(errores, "Hubo Errores");
            }
            return res;
        }
    }
}
